package it.azienda.managerworkstandard.view;

import it.azienda.framework.persistenza.DAOConnectionSingleton;
import it.azienda.framework.utilita.Utilita;
import it.azienda.framework.view.Dettaglio;
import it.azienda.managerworkstandard.modello.BeanFornitore;
import it.azienda.managerworkstandard.modello.BeanLogin;
import it.azienda.managerworkstandard.modello.BeanProdotto;
import it.azienda.managerworkstandard.modello.BeanProdottoDett;
import it.azienda.managerworkstandard.modello.BeanRicercaProdotto;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlForm;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import org.hibernate.Query;
import org.hibernate.Session;

public class DettaglioRicercaProdotto extends Dettaglio {
    private HtmlForm form = new HtmlForm();
    private BeanRicercaProdotto beanRicercaProdotto;
    private ArrayList listaProdotti;
    
    public void setBeanRicercaProdotto(BeanRicercaProdotto beanRicercaProdotto) {
        setObj(beanRicercaProdotto);
        this.beanRicercaProdotto = beanRicercaProdotto;
    }
    
    public BeanRicercaProdotto getBeanRicercaProdotto(){
        return (BeanRicercaProdotto)getObj();
    }
    
    public HtmlForm getForm() {
        form = (HtmlForm) Utilita.getSession().getAttribute("form");
        if (form == null) {
            form = new HtmlForm();
        }
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanRicercaProdotto =(BeanRicercaProdotto) ctx.getExternalContext().getRequestMap().get("beanRicercaProdotto");
        controlloDopoSalvataggio(beanRicercaProdotto);
        Utilita.getSession().removeAttribute("form");
        return form;
    }
    
    public void setForm(HtmlForm form) {
        setFormObject(form);
        this.form = form;
        Utilita.getSession().setAttribute("form",form);
    }
    
    public void controlloDopoSalvataggio(Object obj) {
        BeanRicercaProdotto ricercaProdotto=(BeanRicercaProdotto)obj;
        if(ricercaProdotto.getBeanFornitore()==null){
            ricercaProdotto.setBeanFornitore(new BeanFornitore());
        }
        if(ricercaProdotto.getBeanProdotto()==null){
            ricercaProdotto.setBeanProdotto(new BeanProdotto());
        }
    }
    
    public void ricerca(){
        FacesContext ctx = FacesContext.getCurrentInstance();
        BeanRicercaProdotto ricercaProdotto = (BeanRicercaProdotto) ctx.getApplication().getVariableResolver().resolveVariable(ctx,"beanRicercaProdotto");
        try{
            
            String queryNuova = " select DISTINCT prodottiDett from BeanProdottoDett prodottiDett";
            boolean verifica= false;
            
            if(ricercaProdotto.getIdProdotto() != null){
                queryNuova+=" where prodottiDett.beanProdotto.id  = "+ricercaProdotto.getIdProdotto().toString();
                verifica=true;
            }
            
            if(ricercaProdotto.getIdFornitore() != null){
                if(verifica){
                    queryNuova+=" and ";
                }else{
                    queryNuova+=" where ";
                }
                queryNuova+=" prodottiDett.beanFornitore.id  = "+ricercaProdotto.getIdFornitore().toString();
                verifica=true;
            }
            
            if(ricercaProdotto.getIdFornitore() != null){
                if(verifica){
                    queryNuova+=" and ";
                }else{
                    queryNuova+=" where ";
                }
                queryNuova+=" prodottiDett.beanFornitore.id  = "+ricercaProdotto.getIdFornitore().toString();
                verifica=true;
            }
            
            
            if(ricercaProdotto.getDescrizione()!=null){
                if(ricercaProdotto.getDescrizione().length()>=1){
                    if(verifica){
                        queryNuova+=" and ";
                    }else{
                        queryNuova+=" where ";
                    }
                    queryNuova+=" prodottiDett.descrizioneBreve like '%" + ricercaProdotto.getDescrizione() + "%'";
                    verifica=true;
                }
            }
            
            if(ricercaProdotto.getBarcode() != null ){
                if(ricercaProdotto.getBarcode().length() >= 1){
                    if(verifica){
                        queryNuova = queryNuova + " and ";
                    }else{
                        queryNuova = queryNuova + " where ";
                    }
                    queryNuova = queryNuova + " ( prodottiDett.barcode = '" + ricercaProdotto.getBarcode() + "' OR prodottiDett.barcode2 = '" + ricercaProdotto.getBarcode() + "')";
                    verifica = true;
                }
            }
            
            if(ricercaProdotto.getCodiceDa() != null){
                if(ricercaProdotto.getCodiceDa().length() >= 1){
                    if(verifica){
                        queryNuova+=" and ";
                    }else{
                        queryNuova+=" where ";
                    }
                    queryNuova+=" prodottiDett.codice like '" + ricercaProdotto.getCodiceDa().toUpperCase() + "%'";
                    verifica=true;
                }
            }
            
            if(ricercaProdotto.getCodiceOrdinamento() != null){
                if(ricercaProdotto.getCodiceOrdinamento().intValue() == 1) {
                    queryNuova+=" order by prodottiDett.descrizioneBreve, prodottiDett.codice";
                }else{
                    queryNuova+=" order by prodottiDett.codice, prodottiDett.descrizioneBreve";
                }
            }else{
                queryNuova+=" order by prodottiDett.descrizioneBreve, prodottiDett.codice";
            }
            
            if(!verifica){
                HtmlForm form = (HtmlForm)ctx.getViewRoot().findComponent("erroriDataBase");
                form.setRendered(true);
                ctx.addMessage("erroriDataBase", new FacesMessage("erroriDataBase","Inserire almeno un parametro di ricerca!"));
                return;
            }
            
            Query q=null;
            
            Session sessione = DAOConnectionSingleton.newSession();
            q = sessione.createQuery(queryNuova);
            ArrayList lista = (ArrayList) q.list();
            
            if(lista.size()!=0){
                Utilita.getSession().setAttribute("beanRicercaProdotto", ricercaProdotto);
                this.listaProdotti=lista;
                Utilita.getRequest().setAttribute("listaPrododotti",lista);
                String url2 = "/gestisciRicercaProdotto.jsf";
                UIViewRoot view = ctx.getApplication().getViewHandler().createView(ctx,url2);
                view.setViewId(url2);
                ctx.setViewRoot(view);
                ctx.renderResponse();
            }else{
                HtmlForm form = (HtmlForm)ctx.getViewRoot().findComponent("erroriDataBase");
                form.setRendered(true);
                ctx.addMessage("erroriDataBase", new FacesMessage("erroriDataBase","Nessun Elemento Trovato!"));
                return;
            }
        }catch(Exception ex){
            HtmlForm form = (HtmlForm)ctx.getViewRoot().findComponent("erroriDataBase");
            form.setRendered(true);
            ctx.addMessage("erroriDataBase", new FacesMessage("erroriDataBase","ERRORE: "+ex.toString()));
            return;
        }
    }
    
    public ArrayList getListaProdotti() {
        return listaProdotti;
    }
    
    public void setListaProdotti(ArrayList listaProdotti) {
        this.listaProdotti = listaProdotti;
    }
    
    
    public void caricaOggetto(){
        try{
            FacesContext ctx = FacesContext.getCurrentInstance();
            String idB = Utilita.getRequest().getParameter("idBean");
            BeanProdottoDett  beanProdottoDett = new BeanProdottoDett();
            BeanRicercaProdotto ricercaProdotto = (BeanRicercaProdotto) Utilita.getSession().getAttribute("beanRicercaProdotto");
            
            String queryNuova = " select DISTINCT prodottiDett from BeanProdottoDett prodottiDett";
            boolean verifica= false;
            
            if(ricercaProdotto.getIdProdotto() != null){
                queryNuova+=" where prodottiDett.beanProdotto.id  = "+ricercaProdotto.getIdProdotto().toString();
                verifica=true;
            }
            
            if(ricercaProdotto.getIdFornitore() != null){
                if(verifica){
                    queryNuova+=" and ";
                }else{
                    queryNuova+=" where ";
                }
                queryNuova+=" prodottiDett.beanFornitore.id  = "+ricercaProdotto.getIdFornitore().toString();
                verifica=true;
            }
            
            if(ricercaProdotto.getIdFornitore() != null){
                if(verifica){
                    queryNuova+=" and ";
                }else{
                    queryNuova+=" where ";
                }
                queryNuova+=" prodottiDett.beanFornitore.id  = "+ricercaProdotto.getIdFornitore().toString();
                verifica=true;
            }
            
            
            if(ricercaProdotto.getDescrizione()!=null){
                if(ricercaProdotto.getDescrizione().length()>=1){
                    if(verifica){
                        queryNuova+=" and ";
                    }else{
                        queryNuova+=" where ";
                    }
                    queryNuova+=" prodottiDett.descrizioneBreve like '%" + ricercaProdotto.getDescrizione() + "%'";
                    verifica=true;
                }
            }
            
            if(ricercaProdotto.getBarcode() != null ){
                if(ricercaProdotto.getBarcode().length() >= 1){
                    if(verifica){
                        queryNuova = queryNuova + " and ";
                    }else{
                        queryNuova = queryNuova + " where ";
                    }
                    queryNuova = queryNuova + " ( prodottiDett.barcode = '" + ricercaProdotto.getBarcode() + "' OR prodottiDett.barcode2 = '" + ricercaProdotto.getBarcode() + "')";
                    verifica = true;
                }
            }
            
            if(ricercaProdotto.getCodiceDa() != null){
                if(ricercaProdotto.getCodiceDa().length() >= 1){
                    if(verifica){
                        queryNuova+=" and ";
                    }else{
                        queryNuova+=" where ";
                    }
                    queryNuova+=" prodottiDett.codice like '" + ricercaProdotto.getCodiceDa().toUpperCase() + "%'";
                    verifica=true;
                }
            }
            
            if(ricercaProdotto.getCodiceOrdinamento() != null){
                if(ricercaProdotto.getCodiceOrdinamento().intValue() == 1) {
                    queryNuova+=" order by prodottiDett.descrizioneBreve, prodottiDett.codice";
                }else{
                    queryNuova+=" order by prodottiDett.codice, prodottiDett.descrizioneBreve";
                }
            }else{
                queryNuova+=" order by prodottiDett.descrizioneBreve, prodottiDett.codice";
            }
            
            if(!verifica){
                HtmlForm form = (HtmlForm)ctx.getViewRoot().findComponent("erroriDataBase");
                form.setRendered(true);
                ctx.addMessage("erroriDataBase", new FacesMessage("erroriDataBase","Inserire almeno un parametro di ricerca!"));
                return;
            }
            
            Query q=null;
            
            Session sessione = DAOConnectionSingleton.newSession();
            q = sessione.createQuery(queryNuova);
            ArrayList lista = (ArrayList) q.list();
            
            BeanLogin login= (BeanLogin) Utilita.getSession().getAttribute("login");
            
            sessione = DAOConnectionSingleton.newSession();
            String query = "select prodotto from BeanProdotto prodotto";
            ArrayList listaProdotti = (ArrayList)sessione.createQuery(query).list();
            
            
            beanProdottoDett = (BeanProdottoDett)beanProdottoDett.dettaglio(new Integer(idB));
            
            Utilita.getSession().removeAttribute("login");
            login.setListaOggetti(new HashMap());
            login.settaHashMapOggetti(listaProdotti);
            login.setListaStorico(new HashMap());
            login.setListaStorico2(new HashMap());
            
            HashMap listaOggetti=login.getListaOggetti();
            Integer idBean = beanProdottoDett.getBeanProdotto().getId();
            
            for(int y=0; y<listaOggetti.size();y++){
                Integer pos=new Integer(y);
                Method method=null;
                Object obj=(Object)listaOggetti.get(pos);
                Class classe = obj.getClass();
                classe.newInstance();
                
                Method[] metodi = classe.getMethods();
                for (int i=metodi.length; i>0; i--) {
                    Method metodo = metodi[i-1];
                    String nomeMetodo = metodo.getName();
                    if (nomeMetodo.startsWith("getId")) {
                        method = classe.getMethod(nomeMetodo, new Class[] {});
                        Integer id=(Integer)method.invoke(obj,new Object[] {});
                        if(id.intValue() == idBean.intValue()) {
                            Utilita.getSession().removeAttribute("posizioneOggetto");
                            Utilita.getSession().setAttribute("posizioneOggetto",pos);
                            Utilita.getRequest().setAttribute("beanProdotto",obj);
                            y = listaOggetti.size();
                        }
                    }
                }
            }
            
            /*query = "select prodottoDett from BeanProdottoDett prodottoDett where prodottoDett.beanProdotto.id = :id";
            sessione = DAOConnectionSingleton.newSession();
            listaProdotti = (ArrayList)sessione.createQuery(query).setInteger("id",beanProdottoDett.getBeanProdotto().getId().intValue()).list();
             */
            login.settaHashMapStorico(lista);
            
            listaOggetti = login.getListaStorico();
            idBean = new Integer(idB);
            
            for(int y=0; y<listaOggetti.size();y++){
                Integer pos=new Integer(y);
                Method method=null;
                Object obj=(Object)listaOggetti.get(pos);
                Class classe = obj.getClass();
                classe.newInstance();
                
                Method[] metodi = classe.getMethods();
                for (int i=metodi.length; i>0; i--) {
                    Method metodo = metodi[i-1];
                    String nomeMetodo = metodo.getName();
                    if (nomeMetodo.startsWith("getId")) {
                        method = classe.getMethod(nomeMetodo, new Class[] {});
                        Integer id=(Integer)method.invoke(obj,new Object[] {});
                        if(id.intValue() == idBean.intValue()) {
                            Utilita.getSession().removeAttribute("posizioneOggettoStorico");
                            Utilita.getSession().setAttribute("posizioneOggettoStorico",pos);
                            Utilita.getRequest().setAttribute("beanProdottoDett",obj);
                            y=listaOggetti.size();
                        }
                    }
                }
            }
            login.setMaster(false);
            Utilita.getSession().setAttribute("login",login);
            
            String url2 = "/dettaglioProdottoDett.jsf";
            UIViewRoot view = ctx.getApplication().getViewHandler().createView(ctx,url2);
            view.setViewId(url2);
            ctx.setViewRoot(view);
            ctx.renderResponse();
            
        }catch(Exception ex){}
    }
}